package sy4_Creational_Pattern.factory.method.other;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/*
 * 本程序的功能是使用Java反射方式创建config.xml文件里指定类型的对象
 * 程序XMLUtil.java里创建File对象时引用config.xml的路径及config.xml里定义的类路径（包名）要与实际存放的位置一致！
 * 否则，会出现文档解析路径错误。
 */
public class XMLUtil {   
    //该方法用于从XML配置文件中提取具体类类名，并返回一个实例对象，但可能产生异常（因配置文件错误）
    public static Object getBean() {
        try {
            //创建文档对象
            DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = dFactory.newDocumentBuilder();
            Document doc = builder.parse(new File("src/factory_method1/config.xml")); //factory_method1是包名

            //获取包含类名的文本节点
            NodeList nl = doc.getElementsByTagName("className");

            //获取不同的类名
            Node classNode = nl.item(0).getFirstChild();  //对应类HisenseTVFactory
            //Node classNode = nl.item(1).getFirstChild();  //对应类HaierTVFactory
            String cName = classNode.getNodeValue();

            Class<?> clazz = Class.forName(cName);  //加载类；Class是泛型类
            return clazz.newInstance();  //返回类的实例
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}